package demo9.teht;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.JApplet;
import javax.swing.JPanel;

/**
 *
 * @author Pasi
 */
public class T6_Tehtava extends JApplet {
private Image kuva;             // kuva
  private MediaTracker mt;        // mediatracker, tarkaillaan kuvan latautumista
  private int kuvaX, kuvaY,askel; // kuvan vasen yläkulma ja asken joka siirretään kuvaa
  
  // appletin alustus
  @Override
  public void init() {
     mt = new MediaTracker(this);
     try {
       kuva = getImage(getDocumentBase(),"kuva1.jpg");
       mt.addImage(kuva,0);
       mt.waitForAll();        // odotellaan, että kuva on varmasti latautunut
     } catch (Exception e) {}
     setBackground(Color.black); // musta taustaväri
     kuvaX = 0; // kuva sijoitetaan alkusi vasempaan yläkulmaan
     kuvaY = 0;
     askel = 38;
     // piirto toteutetaan sisäisellä luokalla
     getContentPane().add(new PiirtoPaneeli());
     // nappiksen kuuntelu
     KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
     manager.addKeyEventDispatcher(new MyDispatcher());
  }

  public class PiirtoPaneeli extends JPanel {
      @Override
      public void paintComponent(Graphics g) {
        g.drawImage(kuva,kuvaX,kuvaY,this);
   }   
  }  
  
  // metodi tutkii voidaanko kuvaa siirtää x-suunnassa
  // siirtoalue on rajattu appletin reunoille
  public void siirraX(int suunta) {
    // vasemmalle
    if (suunta == -1) {
      if (kuvaX >= askel) kuvaX-=askel; // voidaan siirtaa askeleen verran vasemmalle
      else if (kuvaX > 0) kuvaX = 0;    // siirretään juuri vasempaan reunaan
    } else { // oikealle
      int leveysAppletti = getSize().width; // appletin leveys
      int leveysKuva = kuva.getWidth(this); // kuvan leveys
      // voidaan siirtaa askeleen verran oikealle
      if ((kuvaX+leveysKuva) <= (leveysAppletti-askel)) kuvaX+=askel;
      // siirretään juuri oikealle reunalle
      else if (kuvaX+leveysKuva < leveysAppletti) kuvaX = leveysAppletti-leveysKuva;
    }
  }  

  // metodi tutkii voidaanko kuvaa siirtää y-suunnassa
  // siirtoalue on rajattu appletin reunoille
  public void siirraY(int suunta) {
    // ylos
    if (suunta == -1) {
      if (kuvaY >= askel) kuvaY-=askel; // voidaan siirtaa askeleen verran ylös
      else if (kuvaY > 0) kuvaY = 0;    // siirretään juuri yläreunaan
    } else { // alas
      int korkeusAppletti = getSize().height; // appletin leveys
      int korkeusKuva = kuva.getHeight(this); // kuvan leveys
      // voidaan siirtaa askeleen verran alas
      if ((kuvaY+korkeusKuva) <= (korkeusAppletti-askel)) kuvaY+=askel;
      // siirretään juuri alareunaan
      else if (kuvaY+korkeusKuva < korkeusAppletti) kuvaY = korkeusAppletti-korkeusKuva;
    }
  }

   // luokka toteuttaa näppiksen kuuntelun
    class MyDispatcher implements KeyEventDispatcher {
        @Override
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getID() == KeyEvent.KEY_PRESSED) {
                // näppäintä painettu
                switch (e.getKeyCode()) {
                  // ylöspäin oleva nuoli
                  case KeyEvent.VK_UP: siirraY(-1); repaint(); break;
                  // alaspäin oleva nuoli
                  case KeyEvent.VK_DOWN: siirraY(1); repaint(); break;
                  // vasen nuoli
                  case KeyEvent.VK_LEFT: siirraX(-1); repaint(); break;
                  // oikea nuoli
                  case KeyEvent.VK_RIGHT: siirraX(+1); repaint(); break;
               }                
            }
            return false;
        }
    }
}
